#include<iostream>
#include<cstdio>
#include<string>

using namespace std;

const int N=1e5+10;
int son[N][31];
int cnt[N];
int idx=0;  //给节点分配id的：遇到没出现在Trie中的元素，就给新出现的元素分配一个属于他的id

void insert_trie(string str)
{
    // cout << str<<endl;
    int p=0;
    for(int i=0;i<str.size();i++)
    {
        int tmp=str[i]-'a';
        if(son[p][tmp]==0)    son[p][tmp]=++idx;

        p = son[p][tmp];  //p 此时指向的是当前 处理的元素
    }
    cnt[p]++;  
}

int count_num_trie(string str)
{
    int p=0;
    for(int i=0;i<str.size();i++)
    {
        int tmp=str[i]-'a';

        if(son[p][tmp]==0)      return 0;
        else p=son[p][tmp];
    }
    return cnt[p];
}

int main()
{
    int n;
    string op;
    // op不是只储存一个大写字母吗，为什么要用字符串，我用char op;都是错的:
    // y总说过这是他血淋淋的教训，因为有好多测试点会输一些空格啊啥的，用字符串可以有效避免这些无效字符，所以即使用字符，也用数组存好一点
    string str;
    cin>>n;
    while(n--)
    {
        cin>>op>>str;
        if(op=="I")
            insert_trie(str);
        else
            cout<<count_num_trie(str)<<endl;
    }

}
